/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package pe.edu.uch.syscom.managedbeans;

import java.util.ArrayList;
import java.util.List;
import javax.faces.event.ActionEvent;
import javax.faces.model.SelectItem;
import org.apache.log4j.Logger;
import pe.edu.uch.syscom.managedbeans.uibeans.UIProductoBean;
import pe.edu.uch.syscom.mapping.TbCatalogo;
import pe.edu.uch.syscom.mapping.TbCategoria;
import pe.edu.uch.syscom.mapping.TbMarca;
import pe.edu.uch.syscom.mapping.TbProducto;
import pe.edu.uch.syscom.mapping.TbSubcategoria;
import pe.edu.uch.syscom.utils.CommonDAO;
import pe.edu.uch.syscom.utils.CommonWeb;

/**
 *
 * @author Jose Tejada
 */
public class ProductoMB {

    private static final long serialVersionUID = 1L;
    private final static Logger m_log = Logger.getLogger( ProductoMB.class );
    private int m_iStock;
    private int m_iIdMarca;
    private int m_iIdCategoria;
    private int m_iIdSubCategoria;
    private double m_dPrecioCosto;
    private double m_dPrecioVenta;
    private String m_sIdTalla;
    private String m_sIdColor;
    private String m_sIdSexo;
    private String m_sCodigo;
    private String m_sNombre;
    private String m_sDescripcion;
    private String m_sCampoBusqueda;
    private String m_sLabelCategSubCategMarca;
    private String m_sOncomplete;
    private String m_sCategSubCategMarc;
    private TbProducto m_tbProducto;
    private SelectItem[] m_cboCategorias;
    private SelectItem[] m_cboSubCategorias;
    private SelectItem[] m_cboMarcas;
    private SelectItem[] m_cboTallas;
    private SelectItem[] m_cboColores;
    private SelectItem[] m_cboSexos;
    private List<UIProductoBean> m_lstUIProductos;

    /** Creates a new instance of productoMB */
    public ProductoMB() {
        m_log.info( "[ProductoMB] << Enter" );
//        m_cboDepartamentos = new SelectItem[ 1 ];
//        m_cboDepartamentos[0] = new SelectItem( "000000", "[Seleccione Departamento]" );
//        m_cboProvincias = new SelectItem[ 1 ];
//        m_cboProvincias[0] = new SelectItem( "000000", "[Seleccione Provincia]" );

        m_tbProducto = new TbProducto();

        m_log.info( "[ProductoMB] >> Exit" );
    }

    public int getIdCategoria() {
        return m_iIdCategoria;
    }

    public void setIdCategoria( int iIdCategoria ) {
        m_iIdCategoria = iIdCategoria;
    }

    public int getIdSubCategoria() {
        return m_iIdSubCategoria;
    }

    public void setIdSubCategoria( int iIdSubCategoria ) {
        m_iIdSubCategoria = iIdSubCategoria;
    }

    public double getPrecioCosto() {
        return m_dPrecioCosto;
    }

    public void setPrecioCosto( double dPrecioCosto ) {
        this.m_dPrecioCosto = dPrecioCosto;
    }

    public double getPrecioVenta() {
        return m_dPrecioVenta;
    }

    public void setPrecioVenta( double dPrecioVenta ) {
        this.m_dPrecioVenta = dPrecioVenta;
    }

    public int getStock() {
        return m_iStock;
    }

    public void setStock( int iStock ) {
        m_iStock = iStock;
    }

    public int getIdMarca() {
        return m_iIdMarca;
    }

    public void setIdMarca( int iIdMarca ) {
        m_iIdMarca = iIdMarca;
    }

    public String getIdTalla() {
        return m_sIdTalla;
    }

    public void setIdTalla( String sIdTalla ) {
        this.m_sIdTalla = sIdTalla;
    }

    public String getIdColor() {
        return m_sIdColor;
    }

    public void setIdColor( String sIdColor ) {
        m_sIdColor = sIdColor;
    }

    public String getIdSexo() {
        return m_sIdSexo;
    }

    public void setIdSexo( String sIdSexo ) {
        m_sIdSexo = sIdSexo;
    }

    public SelectItem[] getCboCategorias() {
        int iSizeCat;
        TbCategoria cat;
        List<TbCategoria> lstCategorias;

        try {
            lstCategorias = CommonDAO.getTbCategoriaDAO().listarCategorias();
            iSizeCat = lstCategorias.size();
            m_cboCategorias = new SelectItem[ iSizeCat + 1 ];
            for ( int i = 0; i < iSizeCat; i++ ) {
                cat = lstCategorias.get( i );
                m_cboCategorias[i + 1] = new SelectItem( cat.getIdCategoria(), cat.getDescripcion() );
            }
        } catch ( Exception ex ) {
            ex.printStackTrace();
        } finally {
            if ( m_cboCategorias == null ) {
                m_cboCategorias = new SelectItem[ 1 ];
            }
            m_cboCategorias[0] = new SelectItem( "0", "[Seleccionar Categoria]" );
        }

        return m_cboCategorias;
    }

    public void setCboCategorias( SelectItem[] cboCategorias ) {
        m_cboCategorias = cboCategorias;
    }

    public SelectItem[] getCboSubCategorias() {
        int iSizeSubCat;
        TbSubcategoria subCat;
        List<TbSubcategoria> lstSubCategorias;

        try {
            lstSubCategorias = CommonDAO.getTbCategoriaDAO().listarSubCategorias( m_iIdCategoria );
            iSizeSubCat = lstSubCategorias.size();
            m_cboSubCategorias = new SelectItem[ iSizeSubCat + 1 ];
            for ( int i = 0; i < iSizeSubCat; i++ ) {
                subCat = lstSubCategorias.get( i );
                m_cboSubCategorias[i + 1] = new SelectItem( subCat.getIdSubcategoria(), subCat.getDescripcion() );
            }
        } catch ( Exception ex ) {
            ex.printStackTrace();
        } finally {
            if ( m_cboSubCategorias == null ) {
                m_cboSubCategorias = new SelectItem[ 1 ];
            }
            m_cboSubCategorias[0] = new SelectItem( "0", "[Seleccionar Sub Categoria]" );
        }
        return m_cboSubCategorias;
    }

    public void setCboSubCategorias( SelectItem[] cboSubCategorias ) {
        m_cboSubCategorias = cboSubCategorias;
    }

    public SelectItem[] getCboMarcas() {
        int iSizeMarcas;
        TbMarca marca;
        List<TbMarca> lstMarcas;

        try {
            lstMarcas = CommonDAO.getTbMarcaDAO().listarMarcas();
            iSizeMarcas = lstMarcas.size();
            m_cboMarcas = new SelectItem[ iSizeMarcas + 1 ];
            for ( int i = 0; i < iSizeMarcas; i++ ) {
                marca = lstMarcas.get( i );
                m_cboMarcas[i + 1] = new SelectItem( marca.getIdMarca(), marca.getMarca() );
            }
        } catch ( Exception ex ) {
            ex.printStackTrace();
        } finally {
            if ( m_cboMarcas == null ) {
                m_cboMarcas = new SelectItem[ 1 ];
            }
            m_cboMarcas[0] = new SelectItem( "0", "[Seleccionar Marca]" );
        }
        return m_cboMarcas;
    }

    public void setCboMarcas( SelectItem[] cboMarcas ) {
        m_cboMarcas = cboMarcas;
    }

    public SelectItem[] getCboTallas() {
        int iSizeTallas;
        TbCatalogo talla;
        List<TbCatalogo> lstTallas;

        try {
            lstTallas = CommonDAO.getTbCatalogoDAO().loadListaCatalogos( "004" );
            iSizeTallas = lstTallas.size();
            m_cboTallas = new SelectItem[ iSizeTallas + 1 ];
            for ( int i = 0; i < iSizeTallas; i++ ) {
                talla = lstTallas.get( i );
                m_cboTallas[i + 1] = new SelectItem( talla.getCodigoGrupo() + talla.getCodigoElemento(), talla.getDescripcionElemento() );
            }
        } catch ( Exception ex ) {
            ex.printStackTrace();
        } finally {
            if ( m_cboTallas == null ) {
                m_cboTallas = new SelectItem[ 1 ];
            }
            m_cboTallas[0] = new SelectItem( "0", "[Seleccionar Talla]" );
        }
        return m_cboTallas;
    }

    public void setCboTallas( SelectItem[] cboTallas ) {
        m_cboTallas = cboTallas;
    }

    public SelectItem[] getCboColores() {
        int iSizeColores;
        TbCatalogo color;
        List<TbCatalogo> lstColores;

        try {
            lstColores = CommonDAO.getTbCatalogoDAO().loadListaCatalogos( "005" );
            iSizeColores = lstColores.size();
            m_cboColores = new SelectItem[ iSizeColores + 1 ];
            for ( int i = 0; i < iSizeColores; i++ ) {
                color = lstColores.get( i );
                m_cboColores[i + 1] = new SelectItem( color.getCodigoGrupo() + color.getCodigoElemento(), color.getDescripcionElemento() );
            }
        } catch ( Exception ex ) {
            ex.printStackTrace();
        } finally {
            if ( m_cboColores == null ) {
                m_cboColores = new SelectItem[ 1 ];
            }
            m_cboColores[0] = new SelectItem( "0", "[Seleccionar Color]" );
        }
        return m_cboColores;
    }

    public void setCboColores( SelectItem[] cboColores ) {
        m_cboColores = cboColores;
    }

    public SelectItem[] getCboSexos() {
        int iSizeSexos;
        TbCatalogo sexo;
        List<TbCatalogo> lstSexos;

        try {
            lstSexos = CommonDAO.getTbCatalogoDAO().loadListaCatalogos( "001" );
            iSizeSexos = lstSexos.size();
            m_cboSexos = new SelectItem[ iSizeSexos + 1 ];
            for ( int i = 0; i < iSizeSexos; i++ ) {
                sexo = lstSexos.get( i );
                m_cboSexos[i + 1] = new SelectItem( sexo.getCodigoGrupo() + sexo.getCodigoElemento(), sexo.getDescripcionElemento() );
            }
        } catch ( Exception ex ) {
            ex.printStackTrace();
        } finally {
            if ( m_cboSexos == null ) {
                m_cboSexos = new SelectItem[ 1 ];
            }
            m_cboSexos[0] = new SelectItem( "0", "[Seleccionar Sexo]" );
        }
        return m_cboSexos;
    }

    public void setCboSexos( SelectItem[] cboSexos ) {
        this.m_cboSexos = cboSexos;
    }

    public TbProducto getTbProducto() {
        return m_tbProducto;
    }

    public void setTbProducto( TbProducto tbProducto ) {
        m_tbProducto = tbProducto;
    }

    public String getCampoBusqueda() {
        return m_sCampoBusqueda;
    }

    public void setCampoBusqueda( String sCampoBusqueda ) {
        m_sCampoBusqueda = sCampoBusqueda;
    }

    public String getCodigo() {
        return m_sCodigo;
    }

    public void setCodigo( String sCodigo ) {
        this.m_sCodigo = sCodigo;
    }

    public String getDescripcion() {
        return m_sDescripcion;
    }

    public void setDescripcion( String sDescripcion ) {
        this.m_sDescripcion = sDescripcion;
    }

    public String getNombre() {
        return m_sNombre;
    }

    public void setNombre( String sNombre ) {
        this.m_sNombre = sNombre;
    }

    public String getOncomplete() {
        return m_sOncomplete;
    }

    public void setOncomplete( String sOncomplete ) {
        m_sOncomplete = sOncomplete;
    }

    public String getCategSubCategMarc() {
        return m_sCategSubCategMarc;
    }

    public void setCategSubCategMarc( String sCategSubCategMarc ) {
        m_sCategSubCategMarc = sCategSubCategMarc;
    }

    public String getLabelCategSubCategMarca() {
        return m_sLabelCategSubCategMarca;
    }

    public void setLabelCategSubCategMarca( String sLabelCategSubCategMarca ) {
        m_sLabelCategSubCategMarca = sLabelCategSubCategMarca;
    }

    public List<UIProductoBean> getLstProductos() {
        m_log.info( "[getLstProductos] << Enter" );
        int iSizeProductos;
        UIProductoBean uiProducto;
        TbProducto tbProducto;
        List<TbProducto> lstProductos;
        m_lstUIProductos = new ArrayList<UIProductoBean>();
        try {

            lstProductos = CommonDAO.getTbProductoDAO().loadListaProductos( m_sCampoBusqueda );

            iSizeProductos = lstProductos.size();
            for ( int i = 0; i < iSizeProductos; i++ ) {
                tbProducto = lstProductos.get( i );

                uiProducto = new UIProductoBean();
                uiProducto.convertir( i + 1, tbProducto );
                m_lstUIProductos.add( uiProducto );
            }
        } catch ( Exception ex ) {
            m_log.error( "EX " + ex );
            m_log.error( "EX " + ex.getMessage() );
            ex.printStackTrace();
        }
        m_log.info( "[getLstProductos] << Exit" );
        return m_lstUIProductos;
    }

    public void setLstProductos( List<UIProductoBean> lstProductos ) {
        m_lstUIProductos = lstProductos;
    }

    //ACCIONES
    public void nuevoProducto( ActionEvent event ) {
        m_tbProducto = new TbProducto();
        m_sOncomplete = "Richfaces.showModalPanel('mpRegistroProductos');";
    }

    public void editarProducto( ActionEvent event ) {
        int iIdProducto;

        iIdProducto = Integer.parseInt( CommonWeb.getParamFromUI( "idProducto" ) );
        m_tbProducto = CommonDAO.getTbProductoDAO().findPorId( iIdProducto );

        if ( m_tbProducto != null ) {
//            sUbic = m_tbProducto.getUbicacion();
//            if ( sUbic != null && sUbic.length() == 6 && !sUbic.equals( "000000" ) ) {
//                m_sDepartamento = sUbic.substring( 0, 2 ) + "0000";
//                m_sProvincia = sUbic.substring( 0, 4 ) + "00";
//            }
            m_sOncomplete = "Richfaces.showModalPanel('mpRegistroProductos');";
        } else {
            m_sOncomplete = "alert('Error al mostrar al producto seleccionado.');";
        }
    }

    public void guardarProducto() {
        TbProducto tbProducto;
        try {
            if ( m_tbProducto != null ) {
                tbProducto = CommonDAO.getTbProductoDAO().getProductoPorDescripcion( m_tbProducto.getDescripcion() );
                if ( procedeGrabado( tbProducto ) ) {
                    if ( m_tbProducto.getIdProducto() == null ) {
                        m_tbProducto.setActivo( 1 );
//                        CommonDAO.getTbProductoDAO().guardarProducto( m_tbProducto );
                        m_sOncomplete = "javascript:Richfaces.hideModalPanel('mpRegistroProductos');alert('Se guardó correctamente.');";
                    } else {
                        try {
//                            CommonDAO.getTbProductoDAO().actualizarProducto( m_tbProducto );
                            m_sOncomplete = "javascript:Richfaces.hideModalPanel('mpRegistroProductos');alert('Se actualizó correctamente.');";
                        } catch ( Exception ex ) {
                            m_sOncomplete = "javascript:Richfaces.hideModalPanel('mpRegistroProductos');alert('Error al actualizar.');";
                        }
                    }
                } else {
                    m_sOncomplete = "javascript:alert('Ya existe la descripcion del producto.');";
                }
            } else {
                m_sOncomplete = "javascript:alert('Error, producto null');";
            }
        } catch ( Exception ex ) {
            m_log.error( "EX : " + ex );
            m_log.error( "EX : " + ex.getMessage() );
            ex.printStackTrace();
        }
    }

    private boolean procedeGrabado( TbProducto tbProducto ) {
        boolean blFlag = true;
        boolean blIsUpdate;
        int iId;
        int iIdAux;
        blIsUpdate = m_tbProducto.getIdProducto() != null;

        if ( blIsUpdate ) {
            iId = m_tbProducto.getIdProducto().intValue();
            if ( tbProducto != null ) {//Existe DNI
                iIdAux = tbProducto.getIdProducto().intValue();
                if ( iId != iIdAux ) {//Y no es la misma persona
                    blFlag = false;//No se puede repetir DNI
                }
            }
        } else {
            if ( tbProducto != null ) {
                blFlag = false;
            }
        }
        return blFlag;
    }

    public void seleccionarProductoPorBorrar( ActionEvent event ) {
        int iIdProducto;
        iIdProducto = Integer.parseInt( CommonWeb.getParamFromUI( "idProducto" ) );
        m_tbProducto = CommonDAO.getTbProductoDAO().findPorId( iIdProducto );
        if ( m_tbProducto != null ) {
            m_sOncomplete = "Richfaces.showModalPanel('mpEliminarProducto');";
        } else {
            m_sOncomplete = "alert('Error al seleccionar producto.')";
        }
    }

    public void eliminarProducto() {
        int iIdProducto;
        iIdProducto = Integer.parseInt( CommonWeb.getParamFromUI( "idProducto" ) );
        if ( m_tbProducto != null && m_tbProducto.getIdProducto().intValue() == iIdProducto ) {
            m_tbProducto.setActivo( 0 );
            CommonDAO.getTbProductoDAO().actualizarProducto( m_tbProducto );
            m_tbProducto = null;
            m_sOncomplete = "javascript:Richfaces.hideModalPanel('mpEliminarProducto');alert('El producto se eliminó correctamente.');";
        } else {
            m_sOncomplete = "alert('Error al seleccionar Producto.');";
        }
    }

    public void nuevaCategoria( ActionEvent event ) {
        m_sLabelCategSubCategMarca = "Categoria";
        m_sOncomplete = "Richfaces.showModalPanel('mpAddCategSubCategMarca');";
    }

    public void nuevaSubCategoria( ActionEvent event ) {
        m_sLabelCategSubCategMarca = "SubCategoria";
        m_sOncomplete = "Richfaces.showModalPanel('mpAddCategSubCategMarca');";
    }

    public void nuevaMarca( ActionEvent event ) {
        m_sLabelCategSubCategMarca = "Marca";
        m_sOncomplete = "Richfaces.showModalPanel('mpAddCategSubCategMarca');";
    }

    public void nuevaTalla( ActionEvent event ) {
        m_sLabelCategSubCategMarca = "Talla";
        m_sOncomplete = "Richfaces.showModalPanel('mpAddCategSubCategMarca');";
    }

    public void addCategSubCategMarca() {
        if ( m_sCategSubCategMarc == null || m_sCategSubCategMarc.trim().isEmpty() ) {
            m_sOncomplete = "alert('Debe ingresar un texto correcto.');";
            return;
        }
        if ( "Categoria".equals( m_sLabelCategSubCategMarca ) ) {
            CommonDAO.getTbCategoriaDAO().saveCategoria( m_sCategSubCategMarc );
        } else if ( "SubCategoria".equals( m_sLabelCategSubCategMarca ) ) {
            CommonDAO.getTbCategoriaDAO().saveSubCategoria( m_sCategSubCategMarc, m_iIdCategoria );
        } else if ( "Marca".equals( m_sLabelCategSubCategMarca ) ) {
            CommonDAO.getTbMarcaDAO().saveMarca( m_sCategSubCategMarc );
        }
        m_sLabelCategSubCategMarca = "";
        m_sOncomplete = "Richfaces.hideModalPanel('mpAddCategSubCategMarca');";
    }
}
